Guide complet pour créer, maintenir et étendre les tests Playwright pour CautioNet.
src/main/java/com/runner/
├── config/ # Configuration et initialisation
│ ├── ConfigManager → Détection environnement (local/serveur)
│ ├── DataSourceReader → Lecture CSV de données de test
│ ├── PlayWrigthConnection → Initialisation Playwright/Browser
│ └── AllureBrowserListener → Listeners Allure pour rapports
│
├── runner/ # Point d'entrée et orchestration
│ ├── TestRunnerApp → Application Spring Boot
│ ├── controller/ → API REST pour interface web
│ │ ├── TestController → POST /api/tests/run
│ │ ├── SuiteController → GET /api/suites
│ │ ├── CsvController → Gestion fichiers CSV
│ │ ├── BrowserController → Navigateurs disponibles
│ │ └── ServerController → Info serveur
│ ├── service/ → Logique métier
│ │ ├── TestRunnerService → Exécution Maven/TestNG
│ │ ├── SuiteService → Gestion suites (suites.json)
│ │ ├── CsvService → Traitement CSV
│ │ ├── DataSourceSyncService → Sync données
│ │ ├── BrowserService → Liste des browsers
│ │ └── ServerService → Infos serveur
│ └── report/ → Génération rapports
│ ├── ReportService → Allure report
│ └── ReportController → API rapports
src/main/java/com/testScenario/
├── pages/ # Page Object Model (POM)
│ ├── StandardPage → Classe mère (Playwright init + utils)
│ ├── LoginPage → Page login (sélecteurs + actions)
│ ├── TestCautionPage → Page test caution
│ └── ToduplicatePage → Page à dupliquer (template)
│
└── tests/ # Suites de tests TestNG
├── LoginTest → @BeforeClass, @Test, @AfterClass
├── TestCautionTest → Scénarios caution
└── Toduplicate → Template pour nouveau test
Fichier : src/main/java/com/testScenario/pages/MyPage.java
package com.testScenario.pages;
import com.runner.config.ConfigManager;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.options.AriaRole;
public class MyPage extends StandardPage {
// Sélecteurs
private static final String BTN_LOGIN = "button:has-text('Login')";
private static final String INPUT_EMAIL = "#email";
private static final String ALERT_ERROR = ".alert-error";
public MyPage(Page page) {
super(page);
}
// Actions
public void fillEmail(String email) {
page.fill(INPUT_EMAIL, email);
}
public void clickLogin() {
page.click(BTN_LOGIN);
}
public boolean isErrorDisplayed() {
return page.locator(ALERT_ERROR).isVisible();
}
// Navigation
public void navigateTo() {
page.navigate(ConfigManager.getBaseUrl() + "/my-page");
}
}Fichier : src/main/java/com/testScenario/tests/MyTest.java
package com.testScenario.tests;
import com.runner.config.ConfigManager;
import com.runner.config.DataSourceReader;
import com.testScenario.pages.MyPage;
import com.microsoft.playwright.*;
import io.qameta.allure.*;
import org.testng.Assert;
import org.testng.annotations.*;
import java.util.Map;
@Feature("My Feature")
public class MyTest {
protected Playwright playwright;
protected Browser browser;
protected BrowserContext context;
protected Page page;
private MyPage myPage;
@BeforeClass
public void setUp() {
playwright = Playwright.create();
String browserType = System.getProperty("browser", "chromium");
browser = playwright.chromium().launch(
new BrowserType.LaunchOptions().setHeadless(true)
);
context = browser.newContext();
page = context.newPage();
myPage = new MyPage(page);
}
@AfterClass
public void tearDown() {
if (context != null) context.close();
if (browser != null) browser.close();
if (playwright != null) playwright.close();
}
@Test(dataProvider = "userData")
@Story("User can login")
@Description("Test login with valid credentials")
public void testLoginSuccess(Map<String, String> data) {
myPage.navigateTo();
myPage.fillEmail(data.get("email"));
myPage.fillPassword(data.get("password"));
myPage.clickLogin();
Assert.assertTrue(myPage.isDashboardVisible(), "Dashboard should be visible");
}
@DataProvider(name = "userData")
public Object[][] getUserData() {
return DataSourceReader.readCsv("login_test.csv");
}
}email,password,expected_role
admin@example.com,SecurePass123,ADMIN
user@example.com,UserPass456,USER
test@example.com,TestPass789,GUESTLecture dans le test :
@DataProvider(name = "testData")
public Object[][] getTestData() {
return DataSourceReader.readCsv("login_test.csv");
}
@Test(dataProvider = "testData")
public void testWithData(Map<String, String> row) {
String email = row.get("email");
String password = row.get("password");
// ...
}# Via interface web
http://localhost:8080
# Via ligne de commande
mvn clean test -Denv=local -DsuiteFile=testng-cautionet.xml
# Avec paramètres spécifiques
mvn clean test \
-Denv=local \
-Dbrowser=firefox \
-DbaseUrl=https://staging.example.com \
-Dlogback.level=DEBUG# Maven compile et génère le WAR
mvn clean package -Pserveur
# Déployer le WAR dans WebLogic
# (procédure WebLogic standard)Fichier : src/main/resources/serviceRessource/suites.json
{
"suites": [
{
"name": "Login Tests",
"file": "testng-cautionet.xml",
"description": "Tests d'authentification",
"tags": ["login", "auth", "smoke"]
},
{
"name": "Caution Tests",
"file": "testng-caution-advanced.xml",
"description": "Scénarios caution complets",
"tags": ["caution", "workflow", "e2e"]
}
]
}- Initialise Playwright, Browser, Context, Page
- Crée les objets Page (POM)
- Appelé avant tous les tests de la classe
- Lit les données du CSV
- Crée un
Map<String, String>pour chaque ligne
- Exécute le scénario avec les données
- Enregistre logs + captures Allure
- Ferme Page, Context, Browser, Playwright
- Génère le rapport Allure
// 1. Utiliser le Page Object Model
public class LoginPage extends StandardPage {
private static final String BTN_SUBMIT = "button:has-text('Login')";
public void clickSubmit() {
page.click(BTN_SUBMIT);
}
}
// 2. Externaliser les données en CSV
@DataProvider
public Object[][] getData() {
return DataSourceReader.readCsv("test-data.csv");
}
// 3. Utiliser Allure pour annotations
@Feature("Authentication")
@Story("User Login")
@Description("Verify valid login works")
public void testLogin() { }
// 4. Attendre les éléments de manière robuste
page.locator(".modal").waitFor();
// 5. Utiliser ConfigManager pour les URLs
String url = ConfigManager.getBaseUrl() + "/path";// ❌ Hardcoder les URLs
page.navigate("https://example.com/login");
// ❌ Chemins absolus des données
String csv = "C:/Users/Alice/data.csv"; // Ne marche que sur ce PC
// ❌ Délais fixes
Thread.sleep(2000); // Utiliser waitFor() à la place
// ❌ Sélecteurs fragiles
page.click("div > div > span:nth-child(3)"); // Utiliser data-testid
// ❌ Tests indépendants du contexte
// Les fichiers de données CSV doivent être versionnésmvn test -Dlogback.level=DEBUGOu dans logback-spring.xml :
<logger name="com.runner" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.testScenario" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>Fichier : local.properties
browser.headless=falseEnsuite :
mvn test -Denv=localset PWDEBUG=1
mvn testInspector Playwright démarre et vous permet d'inspecter pas à pas.
mvn clean installmvn clean package -Pserveur# JAR exécutable local
java -jar target/*.jar --spring.profiles.active=local
# WAR sur WebLogic
# (Consulter doc WebLogic)- Ajouter dans
pom.xml - Tester localement :
mvn clean install - Commiter avec message explicite
- Créer fichier testng dans
src/main/resources/ - Ajouter à
suites.json - Créer les tests correspondants dans
com.testScenario.tests - Tester localement
✅ À commiter :
- Fichiers CSV de test data
- Suites TestNG XML
- Configuration logback
❌ À ignorer (.gitignore) :
local.properties(chemins locaux)- Rapports Allure generés
- Logs d'exécution
target/
- Architecture : Voir la structure dans
src/main/java - Nouveau test : Copier
Toduplicate.java+ adapter - CI/CD : Consulter devops/infra